package com.system.cacheClient.feign;

import com.system.cacheClient.common.CacheR;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 基础缓存服务Feign客户端接口
 * 定义通用的缓存操作方法
 */
@RequestMapping
public interface BaseCacheFeignClient {
    
    /**
     * 获取缓存数据
     * @param key 缓存键
     * @return 缓存数据
     */
    @GetMapping("/{key}")
    <T> CacheR<T> get(@PathVariable("key") String key);

    /**
     * 设置缓存数据
     * @param key 缓存键
     * @param data 缓存数据
     * @return 操作结果
     */
    @PostMapping("/{key}")
    <T> CacheR<Boolean> set(@PathVariable("key") String key, @RequestBody T data);
    
    /**
     * 删除缓存数据
     * @param key 缓存键
     * @return 操作结果
     */
    @DeleteMapping("/{key}")
    CacheR<Boolean> delete(@PathVariable("key") String key);
    
    /**
     * 设置缓存过期时间
     * @param key 缓存键
     * @param timeout 过期时间（秒），0表示立即过期
     * @return 操作结果
     */
    @PostMapping("/{key}/expire")
    CacheR<Boolean> expire(@PathVariable("key") String key, @RequestParam("timeout") long timeout);
    
    /**
     * 获取Hash类型缓存数据
     * @param key 缓存键
     * @return Hash类型缓存数据
     */
    @GetMapping("/{key}/hash")
    CacheR<Map<String, String>> getHash(@PathVariable("key") String key);
    
    /**
     * 设置Hash类型缓存数据
     * @param key 缓存键
     * @param data Hash类型缓存数据
     * @return 操作结果
     */
    @PostMapping("/{key}/hash")
    CacheR<Boolean> setHash(@PathVariable("key") String key, @RequestBody Map<String, String> data);
    
    /**
     * 获取List类型缓存数据
     * @param key 缓存键
     * @return List类型缓存数据
     */
    @GetMapping("/{key}/list")
    CacheR<List<String>> getList(@PathVariable("key") String key);
    
    /**
     * 设置List类型缓存数据
     * @param key 缓存键
     * @param data List类型缓存数据
     * @return 操作结果
     */
    @PostMapping("/{key}/list")
    CacheR<Boolean> setList(@PathVariable("key") String key, @RequestBody List<String> data);
    
    /**
     * 获取Set类型缓存数据
     * @param key 缓存键
     * @return Set类型缓存数据
     */
    @GetMapping("/{key}/set")
    CacheR<Set<String>> getSet(@PathVariable("key") String key);
    
    /**
     * 设置Set类型缓存数据
     * @param key 缓存键
     * @param data Set类型缓存数据
     * @return 操作结果
     */
    @PostMapping("/{key}/set")
    CacheR<Boolean> setSet(@PathVariable("key") String key, @RequestBody Set<String> data);
    
    /**
     * 获取ZSet类型缓存数据
     * @param key 缓存键
     * @return ZSet类型缓存数据
     */
    @GetMapping("/{key}/zset")
    CacheR<Set<String>> getZSet(@PathVariable("key") String key);
    
    /**
     * 设置ZSet类型缓存数据
     * @param key 缓存键
     * @param data ZSet类型缓存数据
     * @return 操作结果
     */
    @PostMapping("/{key}/zset")
    CacheR<Boolean> setZSet(@PathVariable("key") String key, @RequestBody Set<String> data);
}